package criterios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;

import baseDeDatos.GestorBD;
import datosFamilias.*;

public class CriterioEnfermedad extends CriterioAbstracto
{ 
    private String consultaEnfermedad;
    private String consultaDiscapacidad;
    private static ArrayList<String> enfermedadesSeleccionadas = null;
    private static Hashtable<String, ArrayList<String>> discapacidadesSeleccionadas = null;
    
    public CriterioEnfermedad(GestorBD base)
    {
        if(enfermedadesSeleccionadas == null)
        {
            cargarEnfermedadPorDefecto();
        }
        if(discapacidadesSeleccionadas == null)
        {
            cargarDiscapacidadPorDefecto();
        }
        baseDeDatos = base;
        cargarConsulta();
    }
    
    private void cargarConsulta()
    {   
        // 6 tipo de enfermedad, 7 obra social
        consultaEnfermedad = "SELECT p.id, p.name, p.surname, YEAR( CURDATE( ) ) - YEAR( p.borndate ) + IF( DATE_FORMAT( CURDATE( ) , '%m-%d' ) > DATE_FORMAT( p.borndate, '%m-%d' ) , 0, -1 ), p.direction_id, o.descripcion, u.descripcion " +
                             "FROM people p JOIN encuestasrtas s ON (p.id = s.persona_id) " +
                                           "JOIN pregopcions o ON (s.pregunta_id = o.pregunta_id AND s.opcion = o.opcion) " +
                                           "JOIN encuestasrtas t ON (p.id = t.persona_id) " +
                                           "JOIN pregopcions u ON (t.pregunta_id = u.pregunta_id AND t.opcion = u.opcion) " +
                             "WHERE (s.pregunta_id = 61) AND (t.pregunta_id = 57)";
       
        if(!enfermedadesSeleccionadas.isEmpty())
        {
            consultaEnfermedad = consultaEnfermedad + " AND (o.descripcion = '" + enfermedadesSeleccionadas.get(0);
            for(int index = 1; index < enfermedadesSeleccionadas.size(); index++)
            {
                 consultaEnfermedad = consultaEnfermedad +"' OR o.descripcion = '" + enfermedadesSeleccionadas.get(index);
            }
            consultaEnfermedad = consultaEnfermedad + "')";
        }
       
        // 6 tipo de discapacidad, 7 grado de discapacidad, 8 obra social
        consultaDiscapacidad = "SELECT p.id, p.name, p.surname, YEAR( CURDATE( ) ) - YEAR( p.borndate ) + IF( DATE_FORMAT( CURDATE( ) , '%m-%d' ) > DATE_FORMAT( p.borndate, '%m-%d' ) , 0, -1 ), p.direction_id, o.descripcion, u.descripcion, z.descripcion " +
                               "FROM people p JOIN encuestasrtas s ON ( p.id = s.persona_id ) " +
                                             "JOIN pregopcions o ON ( s.pregunta_id = o.pregunta_id AND s.opcion = o.opcion ) " +
                                             "JOIN encuestasrtas t ON ( p.id = t.persona_id ) " +
                                             "JOIN pregopcions u ON ( t.pregunta_id = u.pregunta_id AND t.opcion = u.opcion ) " +
                                             "JOIN encuestasrtas v ON ( p.id = v.persona_id ) " +
                                             "JOIN pregopcions z ON ( v.pregunta_id = z.pregunta_id AND v.opcion = z.opcion ) " +
                               "WHERE (s.pregunta_id = 90) AND (t.pregunta_id = 70) AND (v.pregunta_id = 57)";
        
        if(!discapacidadesSeleccionadas.isEmpty())
        {
            consultaDiscapacidad = consultaDiscapacidad + " AND (";
            boolean esPrimeraEntrada = true;
            for(Enumeration e = discapacidadesSeleccionadas.keys(); e.hasMoreElements();)
            {
                if(!esPrimeraEntrada)
                {
                    consultaDiscapacidad = consultaDiscapacidad + " OR ";
                }
                else
                {
                    esPrimeraEntrada = false;
                }
                String tipoDisc = (String)e.nextElement();
                ArrayList<String> gradoDisc = discapacidadesSeleccionadas.get(tipoDisc);
                for(int index = 0; index < gradoDisc.size(); index++)
                {
                    consultaDiscapacidad = consultaDiscapacidad + "(o.descripcion = '" + tipoDisc + "' AND u.descripcion = '" + gradoDisc.get(index)+ "')";
                    if(index+1 < gradoDisc.size())
                    {
                        consultaDiscapacidad = consultaDiscapacidad + " OR ";
                    }
                }
            }
            consultaDiscapacidad = consultaDiscapacidad + ")";
        }
    }

    @Override
    public void ejecutarConsultas(ArrayList<Familia> familias, int criterio) {
        // Realizamos la consulta
        try
        {
            ResultSet resultadosEnfermedad;
            if(!enfermedadesSeleccionadas.isEmpty())
            { 
                resultadosEnfermedad = baseDeDatos.consultar(consultaEnfermedad);

                // Mientras haya tuplas resultado
                while(resultadosEnfermedad.next())
                {
                    String direccionEnf = resultadosEnfermedad.getString(5);
                    int index = 0;

                    // Buscamos la familia correspondiente al enfermo de acuerdo a la direccion
                    while(index < familias.size() && !direccionEnf.equals(familias.get(index).obtenerDireccion()))
                    {
                        index++;
                    }

                    Familia f = familias.get(index);
                    Persona persEnf = null;

                    // Verificamos si la persona fue creada, en caso de que exista la obtenemos, caso contrario, la creamos.
                    if(f.existeIntegrante(resultadosEnfermedad.getInt(1)))
                    {
                        persEnf = f.obtenerIntegrante(resultadosEnfermedad.getInt(1));
                    }
                    else
                    {
                        persEnf = new Persona(resultadosEnfermedad.getInt(1), resultadosEnfermedad.getString(2)+" "+resultadosEnfermedad.getString(3), resultadosEnfermedad.getInt(4), direccionEnf);
                        f.agregarIntegrante(persEnf);
                    }

                    // Agregamos que la persona esta enferma
                    persEnf.agregarDato(resultadosEnfermedad.getString(6), criterio);
                    persEnf.agregarDato(resultadosEnfermedad.getString(7), criterio);
                }
            
            }
    
            ResultSet resultadosDiscapacidad;
            if(!discapacidadesSeleccionadas.isEmpty())
            {
                resultadosDiscapacidad = baseDeDatos.consultar(consultaDiscapacidad);

                // Mientras haya tuplas resultado
                while(resultadosDiscapacidad.next())
                {
                    String direccionDisc = resultadosDiscapacidad.getString(5);
                    int index = 0;

                    // Buscamos la familia correspondiente al enfermo de acuerdo a la direccion
                    while(index < familias.size() && !direccionDisc.equals(familias.get(index).obtenerDireccion()))
                    {
                        index++;
                    }

                    Familia f = familias.get(index);
                    Persona persDisc = null;

                    // Verificamos si la persona fue creada, en caso de que exista la obtenemos, caso contrario, la creamos.
                    if(f.existeIntegrante(resultadosDiscapacidad.getInt(1)))
                    {
                        persDisc = f.obtenerIntegrante(resultadosDiscapacidad.getInt(1));
                    }
                    else
                    {
                        persDisc = new Persona(resultadosDiscapacidad.getInt(1), resultadosDiscapacidad.getString(2)+" "+resultadosDiscapacidad.getString(3), resultadosDiscapacidad.getInt(4), direccionDisc);
                        f.agregarIntegrante(persDisc);
                    }

                    // Agregamos que la persona esta enferma
                    persDisc.agregarDato(resultadosDiscapacidad.getString(6), criterio);
                    persDisc.agregarDato(resultadosDiscapacidad.getString(7), criterio);
                    persDisc.agregarDato(resultadosDiscapacidad.getString(8), criterio);
                }
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(CriterioEnfermedad.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    // METODOS DE INTERACCION CON LA INTERFAZ GRAFICA
    
    public static void cambiarDetallesEnfermedad(ArrayList<String> configuracion)
    {
        enfermedadesSeleccionadas = configuracion;
    }
    
    public static void cambiarDetallesDiscapacidad(Hashtable<String, ArrayList<String>> configuracion)
    {
        discapacidadesSeleccionadas = configuracion;
    }
    
    public static void cargarEnfermedadPorDefecto()
    {
        enfermedadesSeleccionadas = obtenerEnfermedadPorDefecto();
    }
    
    public static void cargarDiscapacidadPorDefecto()
    {
        discapacidadesSeleccionadas = obtenerDiscapacidadPorDefecto();
    }
    
    public static ArrayList<String> obtenerEnfermedadPorDefecto()
    {
        ArrayList<String> detalles = new ArrayList<String>();
        detalles.add("Bazo (no crónica)");
        detalles.add("Bazo");
        detalles.add("Celiaquía");
        detalles.add("Cerebrales / neurológicas");
        detalles.add("Circulatoria / coronaria");
        detalles.add("Colesterol / triglicéridos");
        detalles.add("Desnutrición");
        detalles.add("Diabetes");
        detalles.add("Diarreas crónicas");
        detalles.add("Digestivas");
        detalles.add("Enfermedades renales");
        detalles.add("Epilepsia");
        detalles.add("Glandulares");
        detalles.add("Gota");
        detalles.add("Hepatitis");
        detalles.add("Hipertensión");
        detalles.add("HIV");
        detalles.add("Sífilis");
        detalles.add("Tumores");
        detalles.add("Visuales");
        detalles.add("Auditivas");
        detalles.add("Fobias");
        detalles.add("Alergias");
        detalles.add("Otras");
        return detalles;
    }
    
    public static Hashtable<String, ArrayList<String>> obtenerDiscapacidadPorDefecto()
    {
        Hashtable<String, ArrayList<String>> detalles = new Hashtable<String, ArrayList<String>>();
        ArrayList<String> grados = new ArrayList<String>();
        grados.add("Leve (menos del 10%)");
        grados.add("Media ( del 10% al 60%)");
        grados.add("Grave ( superior al 60%)");
        detalles.put("Motora", grados);
        detalles.put("Neurológica", (ArrayList<String>) grados.clone());
        detalles.put("Psiquiátrica", (ArrayList<String>) grados.clone());
        detalles.put("Física", (ArrayList<String>) grados.clone());
        return detalles;
    }
    
    public static ArrayList<String> obtenerDisc()
    {
        ArrayList<String> detalles = new ArrayList<String>();
        detalles.add("Leve (menos del 10%)");
        detalles.add("Media ( del 10% al 60%)");
        detalles.add("Grave ( superior al 60%)");
        detalles.add("Motora");
        detalles.add("Neurológica");
        detalles.add("Psiquiátrica");
        detalles.add("Física");
        return detalles;
    }
}